function animate(obj, target,callback) {
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        // 2.步长计算写在定时器里面，每次启动定时器都重新计算步长
        // 这里如果不向上取整，可能就无法到达精确的目标位置，但定时器一直在计算
        var step = ((target - obj.offsetLeft) / 30);
        // step负值往小取，正值往大取
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        // if (step>=0) {
        //     step = Math.ceil(step);
        // } else {
        //     step = Math.floor(step);
        // }
        // 3.停止条件：当前盒子位置等于目标位置
        if (obj.offsetLeft == target) {
            clearInterval(obj.timer);
            // 回调函数写到定时器结束位置
            // if(callback) {
            //     // 如果有回调函数，则执行
            //     callback();     // 背景色变为粉色
            // }
            // 以上判断可以简写如下:
            callback && callback();   // 如果左边callback为真,就会调用右侧callback()
        } else {
            // 1.每次都从当前位置移动一个步长值  步长公式：(目标值 - 现在的位置) / 10
            obj.style.left = obj.offsetLeft + step + 'px';
        }
    }, 10)
}